模拟Linux修改实际、有效和保存设置标识
就是模拟setuid seteuid setreuid setresuid,感觉代码比书上大段的文字好记,就写成代码形式了。
// setuid.cc: 模拟<unistd.h>中的设置用户ID的方法的作用
#include <stdio.h>
#include <errno.h>
int real = 0; // 实际用户ID
int effective = 0; // 有效用户ID
int saved = 0; // 保存的设置用户ID
void showid(); // 打印所有ID
inline bool hasPrivilege() { return effective == 0; }
#define EINVAL_RETURN { errno = EINVAL; return -1; }
#define EPERM_RETURN { errno = EPERM; return -1; }
int setuid(int uid) // 修改所有用户ID
{
if (uid < 0)
EINVAL_RETURN;
if (!hasPrivilege() && uid != real && uid != saved)
EPERM_RETURN;
if (hasPrivilege())
real = effective = saved = uid;
else
effective = uid;
return 0;
}
int seteuid(int euid) // 修改有效用户ID
{
if (euid < 0)
EINVAL_RETURN;
if (!hasPrivilege() && euid != real && euid != saved)
EPERM_RETURN;
effective = euid;
return 0;
}
int setreuid(int ruid, int euid) // 修改实际/有效用户ID
{
if (ruid < -1 || euid < -1)
EINVAL_RETURN;
if (!hasPrivilege())
{
if (ruid != -1 && ruid != real && ruid != effective)
EPERM_RETURN;
if (euid != -1 && euid != real && euid != effective && euid != saved)
EPERM_RETURN;
}
real = (ruid != -1) ? ruid : real;
effective = (euid != -1) ? euid : effective;
if (ruid != -1 || effective != real)
saved = effective;
return 0;
}
// 非SUSv3规范, 其他UNIX实现对其也鲜有支持
int setresuid(int ruid, int euid, int suid) // 修改实际/有效/保存用户ID
{
if (ruid < -1 || euid < -1 || suid < -1)
EINVAL_RETURN;
if (!hasPrivilege())
{
if (ruid != -1 && ruid != real && ruid != effective && ruid != saved)
EPERM_RETURN;
if (euid != -1 && euid != real && euid != effective && euid != saved)
EPERM_RETURN;
if (suid != -1 && suid != real && suid != effective && suid != saved)
EPERM_RETURN;
}
real = (ruid != -1) ? ruid : real;
effective = (euid != -1) ? euid : effective;
saved = (suid != -1) ? suid : saved;
return 0;
}
int main()
{
real = 1000;
// 下面4句只能执行其中1句
// setuid(2000);
setreuid(-1, 2000);
// seteuid(2000);
// setresuid(-1, 2000, 3000);
showid();
return 0;
}
void showid()
{
printf("实际用户ID: %4d\n", real);
printf("有效用户ID: %4d\n", effective);
printf("保存的设置用户ID: %4d\n", saved);
}
main函数是TLPI第9章习题第1道的运行结果,然后模拟了一遍功能,后面几道也很简单就能做出来了。以后忘记的话看遍代码就能很快记起来了。
相关热词: Linux
本站内容来源于网络,如有侵权请与我们联系,我们会及时删除,我们深感抱歉!
注:本站所有信息仅供用于网络技术学习参考,学习中请遵循相关法律法规!
本文地址: https://v30.fanwenzhu.com/server/kaifa/7524.shtml
相关文章
热门TAG
win10 ecshop 主机 阿里云 解决 配置 C# C++ 解析 SQL语句 命令 Go语言 方法 CSS3 HTML5 CSS win7 MSSQL 服务器配置 IIS7.5 IIS7 IIS6 IIS CentOS 7 Linux oracle数据库 oracle phpcms discuz discuz教程最新文章
-
最强调试器DDD(Data Displ
时间:2021-01-07
-
Linux C语言基础IT之家——
时间:2021-01-07
-
Linux内核插入卸载模块
时间:2021-01-07
-
Linux下的c基础编程——字
时间:2021-01-06
-
Linux下的c基础编程——按
时间:2021-01-06
-
Linux下简单的cIT之家——选
时间:2021-01-06
-
linux通过/sys/class/gpio文件操
时间:2021-01-06
-
通过Java实现Linux系统下g
时间:2021-01-06
热门文章
-
开发一个Linux调试器(四):Elves和dwarv
时间:2020-12-22
-
开发一个Linux调试器(五):源码和信号
时间:2020-12-22
-
shell脚本之始
时间:2020-12-29
-
Linux下简单的cIT之家——选择法排序
时间:2021-01-06
-
linux中gdb的可视化调试
时间:2020-12-27
-
如何挑选你的第一门IT之家语言
时间:2020-12-26
-
通过Java实现Linux系统下grep指令的功能
时间:2021-01-06
-
Linux下的c基础编程——按原顺序插入元素
时间:2021-01-06
-
获取linux机器上的网卡地址
时间:2020-12-26
-
Linux内核插入卸载模块
时间:2021-01-07
